﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../global/head.h"
#include "json_impl.h"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 

namespace xos_json
{
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static json_impl::POOL * pool_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    json_impl::json_impl()
    {
        m_strs_iter = m_strs.end();
    }

    json_impl::~json_impl()
    {
        term();
    }

    /////////////////////////////////////////////////////////////////////////////////////////////
    // i_json method

    // 
    // 读取json值
    // 
    const char * json_impl::get_str( const char * lpszKey, char * lpszData, int nLen, int * pnLenNeeded )
    {
        int nRet = 0;

        const char * pRet = 0;
        std::string str;

        if( 0 == nRet )
        {
            if( lpszKey )
            {
                str = m_value[lpszKey].asString();
            }
            else
            {
                str = m_value.asString();
            }
        }

        if( ( 0 == nRet ) && lpszData )
        {
            g_pSysData->m_pContainer->crt()->strcpy( lpszData, nLen, str.c_str() );
        }

        if( ( 0 == nRet ) && pnLenNeeded )
        {
            *pnLenNeeded = ( int )str.length();
        }

        return pRet;
    }

    // 
    // 读取json的key和value值
    // 
    const char * json_impl::get_key( char * lpszKey, int nLen, bool bIsFirst )
    {
        const char * lpszRet = 0;

        if( bIsFirst )
        {
            m_strs.clear();
            m_strs = m_value.getMemberNames();
            m_strs_iter = m_strs.begin();
        }

        if( m_strs_iter != m_strs.end() )
        {
            lpszRet = m_strs_iter->c_str();
            m_strs_iter++;
            if( lpszKey )
            {
                g_pSysData->m_pContainer->crt()->strcpy( lpszKey, nLen, lpszRet );
            }
        }

        return lpszRet;
    }

    // 
    // 读取json值
    // 
    i_json * json_impl::get_json( const char * lpszKey, i_json ** ppv )
    {
        int nRet = 0;

        json_impl * pJson = 0;
        i_json * pRet = 0;

        if( 0 == nRet )
        {
            pJson = json_impl::get_item_from_pool( true );
            pJson->init();
        }

        if( 0 == nRet )
        {
            pJson->m_value = m_value[lpszKey];
        }

        if( 0 == nRet )
        {
            pRet = ( i_json * )pJson;
        }

        if( ( 0 == nRet ) && ppv )
        {
            *ppv = pRet;
        }

        return pRet;
    }

    // 
    // 读取json double值
    // 
    double json_impl::get_double( const char * lpszKey, double * pdValue )
    {
        double dlValue = 0;
        int nRet = 0;

        if( 0 == nRet )
        {
            if( lpszKey )
            {
                dlValue = m_value[lpszKey].asDouble();
            }
            else
            {
                dlValue = m_value.asDouble();
            }
        }

        if( ( 0 == nRet ) && pdValue )
        {
            *pdValue = dlValue;
        }

        return dlValue;
    }

    // 
    // 读取json值
    // 
    int json_impl::get_int( const char * lpszKey, int * pnValue )
    {
        int nValue = 0;
        int nRet = 0;

        if( 0 == nRet )
        {
            if( lpszKey )
            {
                nValue = m_value[lpszKey].asInt();
            }
            else
            {
                nValue = m_value.asInt();
            }
        }

        if( ( 0 == nRet ) && pnValue )
        {
            *pnValue = nValue;
        }

        return nValue;
    }

    // 
    // 设置json值
    // 
    int json_impl::set_str( const char * lpszKey, const char * lpszStr )
    {
        int nRet = 0;
        m_value[lpszKey] = lpszStr;
        return nRet;
    }

    // 
    // 设置json值,设置之后,pv与主对象是独立的
    // 
    int json_impl::set_json( const char * lpszKey, i_json * pv )
    {
        int nRet = 0;
        json_impl * pJson = ( json_impl * )pv;
        m_value[lpszKey] = pJson->m_value;
        return nRet;
    }

    // 
    // 设置json值
    // 
    int json_impl::set_double( const char * lpszKey, double dlData )
    {
        int nRet = 0;
        m_value[lpszKey] = dlData;
        return nRet;
    }

    // 
    // 设置json值
    // 
    int json_impl::set_int( const char * lpszKey, int nData )
    {
        int nRet = 0;
        m_value[lpszKey] = nData;
        return nRet;
    }

    // 
    // 读取数组值
    // 
    i_json * json_impl::get_array_item( int nIndex, i_json ** ppv )
    {
        int nRet = 0;

        json_impl * pJson = 0;
        i_json * pRet = 0;

        if( 0 == nRet )
        {
            pJson = json_impl::get_item_from_pool( true );
            pJson->init();
        }

        if( 0 == nRet )
        {
            pJson->m_value = m_value[nIndex];
        }

        if( 0 == nRet )
        {
            pRet = ( i_json * )pJson;
        }

        if( ( 0 == nRet ) && ppv )
        {
            *ppv = pRet;
        }

        return pRet;
    }

    // 
    // 向数组添加无素,添加数组字串元素
    // 
    int json_impl::append_str( const char * lpszStr )
    {
        int nRet = 0;
        m_value.append( lpszStr );
        return nRet;
    }

    // 
    // 向数组添加无素,添加数组整数元素
    // 
    int json_impl::append_double( double dlData )
    {
        int nRet = 0;
        m_value.append( dlData );
        return nRet;
    }

    // 
    // 向数组添加无素,添加数组整数元素
    // 
    int json_impl::append_int( int nData )
    {
        int nRet = 0;
        m_value.append( nData );
        return nRet;
    }

    // 
    // 向数组添加无素,添加时是复制操作
    // 
    int json_impl::append_array( i_json * pv )
    {
        int nRet = 0;
        json_impl * pJson = ( json_impl * )pv;
        m_value.append( pJson->m_value );
        return nRet;
    }

    // 
    // 返回数组长度
    // 
    int json_impl::get_array_size()
    {
        int nRet = 0;
        nRet = m_value.size();
        return nRet;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////
    // public method

    int json_impl::get_addr( POOL *** pppPool, LIST *** pppList )
    {
        int ret = 0;
        if( pppPool )
        {
            *pppPool = &pool_ptr;
        }
        if( pppList )
        {
            *pppList = 0;
        }
        return ret;
    }

    int json_impl::init()
    {
        int nRet = 0;
        return nRet;
    }

    int json_impl::term()
    {
        int nRet = 0;

        m_strs.clear();
        m_strs_iter = m_strs.end();
        Json::Value v;
        m_value.swap( v );

        return nRet;
    }

} // xos_json
